package com.xunge.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.xunge.mapper.EmpExprMapper;
import com.xunge.mapper.EmpMapper;
import com.xunge.pojo.*;
import com.xunge.service.EmpLogService;
import com.xunge.service.EmpService;
import com.xunge.utils.CurrentHolder;
import com.xunge.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.*;

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {


//-------------------------原始方法--------------------------------------------------------------
//    @Autowired
//    private EmpMapper empMapper;
//    @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize) {
//        Long total = empMapper.total();
//        Integer start = (page - 1) * pageSize;
//        List<Emp> rows = empMapper.rows(start,pageSize);
//
//        return new PageResult<Emp>(total,rows);
//    }


//==============================pageHelper插件分页查询================================================
//    @Autowired
//    private EmpMapper empMapper;
//    @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize, String name, Integer gender, LocalDate begin, LocalDate end) {
//        PageHelper.startPage(page,pageSize);
//
//        List<Emp> list = empMapper.list(name,gender,begin,end);
//
//        Page<Emp> p = (Page<Emp>) list;
//
//        return new PageResult<Emp>(p.getTotal(),p.getResult()) ;
//    }

//==============================pageHelper插件分页查询================================================
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogService empLogService;

    /**
     * 根据查询参数分页查询员工信息
     *
     * @param empQueryParam 包含分页信息和查询条件的员工查询参数对象
     * @return 返回分页查询结果，包括总记录数和员工列表
     * 此方法使用了PageHelper分页插件来实现分页查询功能它首先根据提供的页码和页面大小信息
     * 设置分页参数，然后调用mapper的查询方法获取指定条件下的员工列表通过强制类型转换获取
     * Page对象，进而获取总记录数和结果列表，最后封装到PageResult对象中返回
     */
    @Override
    public PageResult<Emp> page(EmpQueryParam empQueryParam) {
        // 启动分页，设置当前页和每页大小
        PageHelper.startPage(empQueryParam.getPage(),empQueryParam.getPageSize());

        // 执行查询，获取员工列表
        List<Emp> list = empMapper.list(empQueryParam);

        // 将查询结果转换为Page对象，以便获取总记录数
        Page<Emp> p = (Page<Emp>) list;

        // 构造并返回分页查询结果对象，包括总记录数和当前页的员工列表
        return new PageResult<Emp>(p.getTotal(),p.getResult()) ;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save(Emp emp) {
        try {
            //补全基本信息
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            //保存员工信息
            empMapper.insert(emp);
            //批量保存工作经历
            List<EmpExpr> exprList = emp.getExprList();
            exprList.forEach(expr -> {
                expr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);

        } finally {
            EmpLog empLog = new EmpLog(null,LocalDateTime.now(),emp.toString());
            empLogService.insertLog(empLog);
        }

    }

    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void delete(List<Integer> ids) {
        //1.根据ID批量删除员工信息
        empMapper.deleteById(ids);
        //2.根据ID批量删除员工工作经历
        empExprMapper.deleteByEmpId(ids);
    }

    @Override
    public Emp getById(Integer id) {
        return empMapper.getById(id);
    }

    @Override
    public List<Emp> list() {
        return empMapper.findAll();
    }

    @Override
    public LoginInfo login(Emp emp) {
        //1.根据用户名和密码查询员工信息
        Emp e = empMapper.selectByNameAndPassword(emp);
        //2.判断员工是否存在，并封装返回
        if (e != null){
            log.info("登录成功：{}",e);

            Map<String, Object> claims = new HashMap<>();
            claims.put("id",e.getId());
            claims.put("username",e.getUsername());
            String jwt = JwtUtils.generateToken(claims);
            return new LoginInfo(e.getId(),e.getUsername(),e.getName(),jwt);
        } else {
            log.info("登录失败：{}",emp);
            return null;
        }
    }
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void update(Emp emp) {
        //1.修改员工信息emp表
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateById(emp);

        //2.修改员工工作经历信息
        //2.1先删除
        empExprMapper.deleteByEmpId(Arrays.asList(emp.getId()));
        //2.2再更新
        List<EmpExpr> empExprsList = emp.getExprList();
        if (!CollectionUtils.isEmpty(empExprsList)){
            empExprsList.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
            empExprMapper.insertBatch(empExprsList);
        }

    }

    @Override
    public void updatePassword(Map<String, String> passwordData) {
        String oldPassword = passwordData.get("oldPassword");
        String newPassword = passwordData.get("newPassword");
        Integer empId = CurrentHolder.getCurrentId();
        
        if (empId == null) {
            throw new RuntimeException("用户未登录");
        }
        
        // 获取当前员工信息
        Emp currentEmp = empMapper.getById(empId);
        if (currentEmp == null) {
            throw new RuntimeException("员工信息不存在");
        }
        
        // 验证旧密码
        if (!currentEmp.getPassword().equals(oldPassword)) {
            throw new RuntimeException("原密码错误");
        }
        
        // 更新密码
        Emp updateEmp = new Emp();
        updateEmp.setId(empId);
        updateEmp.setPassword(newPassword);
        updateEmp.setUpdateTime(LocalDateTime.now());
        
        empMapper.updateById(updateEmp);
        
        log.info("员工{}修改密码成功", currentEmp.getUsername());
    }
}
